package com.tdam2011.grupo06.control;

import java.util.Comparator;

import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.gui.ListadoContactos.ContactAdapter;
import com.tdam2011.grupo06.gui.SetPreferenceFiltrarContactos;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.Telefono;

public class GestorContactos
{
	private Context context;
	private boolean actualizar = false;
	
	public GestorContactos(Context c)
	{
		context = c;
	}
	
	public void actualizar()
	{
		actualizar = true;
	}
	
	public ContactAdapter cargarContactos(ContactAdapter adapter)
	{
		ContentResolver cr = context.getContentResolver();
		
		Contacto contacto;
    	Comparator<Contacto> comparator = getComparator();
    	SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
    	
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        if (cur.getCount() > 0) 
        {
		    while (cur.moveToNext()) 
		    {
		    	String stringId = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
		    	int id = Integer.parseInt(stringId);
		        String nombre = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
		        Uri photoUri = StrUriPhoto.getInstance().getPhotoUriById( this.context, id);
		        
		        contacto = new Contacto(id, nombre, photoUri);
		        
		        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
		        {
		        	Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{stringId}, null);

		        	while (pCur.moveToNext()) 
         	        {
		        		String idTel = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
		        		String tel = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
		        		String type = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
		        		contacto.addTel(new Telefono(Integer.parseInt(idTel), tel, Integer.parseInt(type)));		        		
         	        } 
         	        pCur.close();
	 	        }
		        
		        if(contacto.getTel().size()!=0)
				{
					DatabaseHelper db = DatabaseHelper.getInstance(context);
					contacto = db.getContactByDBId(contacto);
					Telefono aux = contacto.getTelById(contacto.getTelPref());
					if(aux==null)
					{
						contacto.setNumPre(contacto.getTel(0).getNumero());
					}
					else
					{
						contacto.setNumPre(aux.getNumero());
					}
				}
				else
				{
					contacto.setNumPre("");
				}
		        
		        contacto = DatabaseHelper.getInstance(context).getContactByDBId(contacto);
     	        
		        if(myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_TODOS, true))
		    	{
		        	adapter.addContactInfo(contacto);
		    	}
		        else
		        {
		        	boolean tel = true;
		        	boolean foto = true;
		        	boolean usuario = true;
		        	boolean none = true;
		        	
		        	if(myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_TEL, true)){if(contacto.getTel().size()<=0){tel=false;}}
		        	
		        	if(myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_FOTOS, true))
		        	{
		        		Uri photo = Uri.parse( "android.resource://"+ context.getPackageName() +"/" + R.drawable.ic_contact );
		        		if(contacto.getPhotoUri().compareTo(photo) == 0){foto=false;}
		        	}
		        	
		        	if(myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_USUARIO, true)){if(contacto.getUsuario()==null){usuario=false;}}
		        	
		        	if(!myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_TEL, true)
		        		&& !myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_FOTOS, true) 
		        		&& !myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_USUARIO, true)) {
		        		none=false;
		        	}
		        	
		        	if(tel && foto && usuario && none)
		        	{
		        		adapter.addContactInfo(contacto);
		        	}
		        }
	 		}
	    }
        cur.close();
        
        if(comparator!=null)
        {
        	adapter.ordenarContactos(comparator);
        }
        else
        {
        	adapter.ordenarContactos(Contacto.comparadorNombreDesc);
        }
        
        return adapter;
	}
	
	public boolean verificarContactos(ContactAdapter adapter) 
	{
		ContentResolver cr = context.getContentResolver();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		
		if(actualizar) {actualizar = false; return true;}
    	if(myPreference.getBoolean(SetPreferenceFiltrarContactos.CONTACTOS_TODOS, true))
    	{
    		Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    		if(cur.getCount()!=adapter.getCount()) {return true;}
    	}   		
		return false;
	}
	
	private Comparator<Contacto> getComparator() 
	{
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
    	String[] order = context.getResources().getStringArray(R.array.ordenamietoContactos);
    	String orden = myPreference.getString("ordenamiento", "");
		int i;
    	for (i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			break;
    		}
    	}
    	switch (i) 
    	{
    		case 0:
    			return Contacto.comparadorNombreAsc;
    		case 1:
    			return Contacto.comparadorNombreDesc;
    		case 2:
    			return Contacto.comparadorTelPreAsc;
    		case 3:
    			return Contacto.comparadorTelPreDesc;
    		default:
    			return null;
		}
	}
}
